package top.chatgqt.SmartChargeStation.netty.server.handlers;

import io.netty.channel.Channel;
import io.netty.channel.ChannelHandlerContext;
import io.netty.channel.SimpleChannelInboundHandler;
import io.netty.handler.codec.http.websocketx.BinaryWebSocketFrame;
import io.netty.handler.codec.http.websocketx.TextWebSocketFrame;
import io.netty.handler.codec.http.websocketx.WebSocketFrame;
import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.ConcurrentHashMap;

/*
    WebSocketFrame: 是WebSocket数据帧的格式
 */

/**
 * 自定义的WebSocket处理器
 */
@Slf4j
public class ImoocWebSocketInboundHandler extends SimpleChannelInboundHandler<WebSocketFrame> {

    private ConcurrentHashMap<String, Channel> channelMap = new ConcurrentHashMap<>();

    // 有新的客户端连接进来会触发
    @Override
    public void handlerAdded(ChannelHandlerContext ctx) throws Exception {
        Channel channel = ctx.channel();
        log.info(">>>>> 新的客户端连接：{}", channel.id().asLongText());
        // 保存当前连接进来的channel
        channelMap.put(channel.id().asLongText(), channel);
    }

    // 客户端断开触发
    @Override
    public void handlerRemoved(ChannelHandlerContext ctx) throws Exception {
        channelMap.remove(ctx.channel().id().asLongText());
    }

    // 接收到消息触发
    @Override
    protected void channelRead0(ChannelHandlerContext ctx, WebSocketFrame msg) throws Exception {
        // 判断数据帧是否是文本类型
        if (msg instanceof TextWebSocketFrame) { //  数据帧是文本类型
            String message = ((TextWebSocketFrame) msg).text();
            log.info(">>>>> 收到的文本消息内容是：{}", message);

        }else if(msg instanceof BinaryWebSocketFrame){ // 数据帧是二进制类型
            /*
            微信小程序发送过来的Protobuf序列化之后的数据是二进制的，在WebSocket中是BinaryWebSocket类型

            Protobuf序列数据会在这里处理
            */


        }
    }
}
